package com.aids_malaria.http.api;

import com.aids_malaria.http.response.AppUpdate;
import com.aids_malaria.http.response.AreaC;
import com.aids_malaria.http.response.AreaV;
import com.aids_malaria.http.response.BaseResponse;
import com.aids_malaria.http.response.DataQueryResponse;
import com.aids_malaria.http.response.DiagnosisInfoPack;
import com.aids_malaria.http.response.DiagnosisTreatmentInfo;
import com.aids_malaria.http.response.DoLoginResponse;
import com.aids_malaria.http.response.DownloadNum;
import com.aids_malaria.http.response.DrugallergyInfoPack;
import com.aids_malaria.http.response.EaProcessPack;
import com.aids_malaria.http.response.GetMedicalTreatmentPack;
import com.aids_malaria.http.response.LoginUserAuth;
import com.aids_malaria.http.response.MedicalTreatment;
import com.aids_malaria.http.response.MemberDataResponse;
import com.aids_malaria.http.response.MosquitoData;
import com.aids_malaria.http.response.MosquitoInvest;
import com.aids_malaria.http.response.Pad;
import com.aids_malaria.http.response.PadMaxIdentitySeq;
import com.aids_malaria.http.response.PersonData;
import com.aids_malaria.http.response.PremedicalTreatmentPack;
import com.aids_malaria.http.response.Role;
import com.aids_malaria.http.response.RoleAuth;
import com.aids_malaria.http.response.User;
import com.aids_malaria.http.response.WorkAreaPersonID;
import com.aids_malaria.http.response.WorkAreaResponse;
import com.aids_malaria.http.response.login.LoginResponse;
import com.aids_malaria.http.response.register.RegistResponse;

import java.util.HashMap;
import java.util.List;

import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;

/**
 * Author: fwp
 * Date: 2019-04-09
 * Description: retrofit请求每个接口的入口
 */

public interface RetrofitApi {

    /**
     * 版本更新
     * @param api_token
     * @return
     */
    @GET("apps/latest/5e7220920d81cc4f6a593ba2")
    Observable<AppUpdate> appUpdate(@Query("api_token") String api_token);

    /**
     * 登录
     * @param user_code
     * @param pad_id
     * @param password
     * @return
     */
    @GET("com_dologin.do")
    Observable<LoginResponse<DoLoginResponse>> dologin(@Query("user_code") String user_code, @Query("pad_id")
            String pad_id, @Query("password") String password);
    /**
     * 登录
     * @param user_code
     * @param pad_id
     * @param password
     * @return
     */
    @GET("com_ResistPad.do")
    Observable<RegistResponse<Object>> doRegister(@Query("user_code") String user_code, @Query("pad_id")
            String pad_id, @Query("password") String password);

    /**
     * 退出登录
     * @param user_code
     * @param pad_id
     * @param password
     * @return
     */
    @POST("com_logout.do")
    Observable<BaseResponse<Object>> logout(@Query("user_code") String user_code, @Query("pad_id")
            String pad_id, @Query("password") String password);

    /**
     * 检查连接状态
     * @param pad_id
     * @return
     */
    @POST("com_checkLink.do")
    Observable<BaseResponse<Object>> checkLink(@Query("pad_id") String pad_id);

    /*************设置模块******************/

    /**
     * 获取用户数据
     * @param user_code
     * @param user_name
     * @return
     */
    @GET("com_getUser.do")
    Observable<BaseResponse<List<User>>> getUser(@Query("user_code") String user_code,
                                                 @Query("user_name") String user_name);

    /**
     * 保存用户数据
     * @param busy_type  保存类型 1插入 2更改 3 删除
     * @param requestBod  (各数据字段定义见数据库TBL_COM_USER表定义)： 该用户数据（json格式）
     * @return
     */
    @POST("com_saveUser.do")
    Observable<BaseResponse<Object>> saveUser(@Query("busy_type") String busy_type,
                                              @Body RequestBody requestBod);

    /**
     * 获取角色数据
     * @param role_name
     * @return
     */
    @GET("com_getRole.do")
    Observable<BaseResponse<List<Role>>> getRole(@Query("role_name") String role_name);

    /**
     * 获取角色权限数据
     * @param role_id
     * @return
     */
    @GET("com_getRole_Auth.do")
    Observable<BaseResponse<List<RoleAuth>>> getRoleAuth(@Query("role_id") String role_id,@Query("func_name") String func_name);

    /**
     * 获取角色权限数据
     * @return
     */
    @GET("com_getRole_Auth.do")
    Observable<BaseResponse<List<RoleAuth>>> getRoleAuth();

    /**
     * 获取新角色权限数据
     * @return
     */
    @GET("com_getNewRole_Auth.do")
    Observable<BaseResponse<List<RoleAuth>>> getNewRoleAuth(@Query("func_name") String func_name);

    /**
     * 保存新角色权限数据
     * @param busy_type  角色保存类型 1插入 2更改 3 删除
     * @param busy_type_auth  角色权限数据保存类型，1插入 2更改 3 删除，位串，权限数据有多少条就有几位
     * @param requestBod  (各数据字段定义见数据库表TBL_COM_ROLE定义) 该角色数据 (json格式) (各数据字段定义见数据库表TBL_COM_ROLE_AUTH定义)：角色权限数据（多条）
     * @return
     */
    @POST("com_saveRole.do")
    Observable<BaseResponse<Object>> saveRole(@Query("busy_type") String busy_type,
                                              @Query("busy_type_auth") String busy_type_auth,
                                              @Body RequestBody requestBod);

    @POST("com_getUserAUTH.do ")
    Observable<BaseResponse<List<LoginUserAuth>>> getUserAUTH();

    /**
     * 获取工作区域设置数据
     * @return
     */
    @GET("com_getWorkarea.do")
    Observable<BaseResponse<List<WorkAreaResponse>>> getWorkArea();

    /**
     * 保存工作区域设置数据
     * @param busy_type 保存类型 1插入 2更改 3 删除
     * @param requestBody {"pad_id":"110001","village_data":[{"village_code":"150001","village_name":"Conde",
     *             "xy":"x:1.0,y:1.0"},{"village_code":"150003","village_name":"Micoló","xy":"x:1.0,y:1.0"}],
     *             "work_mode":1,"x1":1,"x2":2,"y1":1,"y2":2}
     * @return
     */
    @POST("com_saveWorkarea.do")
    Observable<BaseResponse<Object>> saveWorkarea(@Query("busy_type") String busy_type, @Body RequestBody requestBody);

    /**
     * 获取行政县数据
     * @param county_code  行政县代码
     * @return
     */
    @GET("com_getCounty.do")
    Observable<BaseResponse<List<AreaC>>> getCounty(@Query("county_code") String county_code,
                                                    @Query("county_name") String county_name);

    /**
     * 获取行政县数据
     * @return
     */
    @GET("com_getCounty.do")
    Observable<BaseResponse<List<AreaC>>> getCounty();

    /**
     * 获取行政村数据
     * @param county_code  行政县代码
     * @param village_name  行政村名称
     * @return
     */
    @GET("com_getVillage.do")
    Observable<BaseResponse<List<AreaV>>> getVillage(@Query("county_code") String county_code,
                                                     @Query("village_name") String village_name);

    /**
     * 获取行政村数据
     * @return
     */
    @GET("com_getVillage.do")
    Observable<BaseResponse<List<AreaV>>> getVillage();

    /**
     * 获取GPS范围内的行政村数据
     * @param x_fr  起点坐标点的X
     * @param y_fr  起点坐标点的Y
     * @param x_to  终点坐标点的X
     * @param y_to  终点坐标点的Y
     * @return
     */
    @GET("com_getGPSRangeVillage.do")
    Observable<BaseResponse<List<AreaV>>> getGPSRangeVillage(@Query("x_fr") String x_fr,@Query("y_fr") String y_fr,
                                                             @Query("x_to") String x_to,@Query("y_to") String y_to);


    /**
     * 保存行政村数据
     * @param busy_type  保存类型 1插入 2更改 3 删除
     * @param requestBody (各数据字段定义见数据库TBL_COM_AREAV表定义)： 该用户数据（json格式）
     * @return
     */
    @POST("com_saveVillage.do")
    Observable<BaseResponse<Object>> saveVillage(@Query("busy_type") String busy_type,
                                                 @Body RequestBody requestBody);

    /**
     * 获取pad数据
     * @return
     */
    @GET("com_getPad.do")
    Observable<BaseResponse<List<Pad>>> getPad();

    /**
     * 获取pad数据
     * @return
     */
    @GET("com_getPad.do")
    Observable<BaseResponse<List<Pad>>> getPad(@Query("pad_id") String pad_id);

    /**
     * 修改、插入pad
     * @param busy_type:保存类型 1插入 2更改 3 删除
     * @param requestBody
     * @return
     */
    @POST("com_savePad.do")
    Observable<BaseResponse<Object>> savePad(@Query("busy_type") String busy_type, @Body RequestBody requestBody);

    /**
     * 删除多个用户
     * @param requestBody 数据格式举例：[{"user_code":"test123123"},{"user_code":"test900"}]
     * @return
     */
    @POST("com_multiDeleteUser.do")
    Observable<BaseResponse<Object>> multiDeleteUser(@Body RequestBody requestBody);

    /**
     * 删除多个角色
     * @param requestBod 数据格式举例：[{"role_id":"test4"},{"role_id":"teset4"}]
     * @return
     */
    @POST("com_multiDeleteRole.do")
    Observable<BaseResponse<Object>> multiDeleteRole(@Body RequestBody requestBod);

    /**
     * 获取下载数据总数量
     * @return
     */
    @GET("com_getDownloadNum.do")
    Observable<BaseResponse<DownloadNum>> getDownloadNum();

    /**
     * 获取身份码各区段最大的序号数据
     * @return
     */
    @GET("com_getPadMaxIdentitySeq.do")
    Observable<BaseResponse<List<PadMaxIdentitySeq>>> getPadMaxIdentitySeq();

    /**
     * 获取全部通用词汇数据
     * @return
     */
    @GET("com_getCommonWords.do")
    Observable<BaseResponse<List<Object>>> getCommonWords();

    /**
     * 获取该pad的工作区域范围内人员的身份码集合
     * @return
     */
    @GET("com_getWorkAreaPersonIDList.do")
    Observable<BaseResponse<List<WorkAreaPersonID>>> getWorkAreaPersonIDList();

    /**
     * 获取工作区域范围内的蚊媒调查数据
     * @return
     */
    @GET("com_getMosquito_investbyworkarea.do")
    Observable<BaseResponse<List<MosquitoInvest>>> getMosquito_investbyworkare();


    /**************设置模块******************/


    /**************统计报告模块******************/

    /**
     * 药物治疗统计数据
     * @param area_code
     * @param record_seq
     * @return
     */
    @GET("com_getMeical_treatmentSum.do")
    Observable<BaseResponse<List<MedicalTreatment>>> getMedicalData(@Query("area_code") String area_code,
                                                                    @Query("record_seq") String record_seq);

    /**
     * 获取人员数据
     * @return
     */
    @GET("com_getPersonSum.do")
    Observable<BaseResponse<MemberDataResponse>> getPersonData(@QueryMap HashMap<String,String> map);

    /**
     * 获取蚊媒统计数据
     * @param map
     * @return
     */
    @GET("com_getMosquitoSum.do")
    Observable<BaseResponse<List<MosquitoData>>> getMosquitoSum(@QueryMap HashMap<String,String> map);

    /**
     * 查询人员采集数据
     * @param map
     * @return
     */
    @GET("com_getPersonGatherInfo.do")
    Observable<BaseResponse<List<DataQueryResponse>>> getPersonGatherInfo(@QueryMap HashMap<String,String> map);


    /**************统计报告模块******************/


    /**************数据采集模块******************/

    /**
     * 获取某人员药物安全性信息
     * @param identity_code
     * @return
     */
    @GET("com_getDrugallergy_info.do")
    Observable<BaseResponse<List<DrugallergyInfoPack>>> getDrugallergyInfo(@Query("identity_code") String identity_code);

    /**
     * 获取人员既往病史和治疗信息
     * @param identity_code
     * @return
     */
    @GET("com_getPremedical_treatment.do")
    Observable<BaseResponse<List<PremedicalTreatmentPack>>> getPremedicalTreatment(@Query("identity_code") String identity_code);

    /**
     * 获取药物治疗信息（从属于某条人员诊断信息）
     * @param identity_code
     * @param record_no
     * @return
     */
    @GET("com_getMeical_treatment.do")
    Observable<BaseResponse<List<GetMedicalTreatmentPack>>> getMeicalTreatment(@Query("identity_code") String identity_code, @Query("record_no") String record_no);

    /**
     * 获取疫源处理信息（从属于某条人员诊断信息）
     * @param identity_code
     * @param record_no
     * @return
     */
    @GET("com_getEa_process.do")
    Observable<BaseResponse<List<EaProcessPack>>> getEaProcess(@Query("identity_code") String identity_code, @Query("record_no") String record_no);

    /**
     * 获取人员诊断信息
     * @param identity_code
     * @return
     */
    @GET("com_getDiagnosis_info.do")
    Observable<BaseResponse<List<DiagnosisInfoPack>>> getDiagnosisInfo(@Query("identity_code") String identity_code);

    /**
     * 获取人员基础信息
     * @param map
     * @return
     */
    @GET("com_getPerson.do")
    Observable<BaseResponse<List<PersonData>>> getPerson(@QueryMap HashMap<String,Object> map);

    /**
     * 获取人员诊疗全部信息（包括人员基本信息）
     * @param identity_code
     * @return
     */
    @GET("com_getDiagnosis_TreatmentInfo.do")
    Observable<BaseResponse<DiagnosisTreatmentInfo>> getDiagnosisTreatmentInfo(@Query("identity_code") String identity_code,
                                                                               @Query("is_photo") String is_photo);

    /**
     * 保存人员基础信息
     * @param busy_type
     * @return
     */
    @POST("com_savePerson.do")
    Observable<BaseResponse<Object>> savePersonData(@Query("busy_type") int busy_type , @Body RequestBody requestBody);

//    /**
//     * 保存人员诊疗信息
//     * @param map
//     * @return
//     */
//    @POST("com_saveDiagnosis_treatment.do")
//    Observable<BaseResponse<Object>> saveDiagnosisTreatment(@QueryMap HashMap<String,Object> map);

    /**
     * 保存人员诊疗信息
     * @return
     */
    @POST("com_saveDiagnosis_treatment.do")
    Observable<BaseResponse<Object>> saveDiagnosisTreatment(@Query("busy_type") String busy_type , @Body RequestBody requestBody);

    /**
     * 获取蚊媒数据
     * @param area_code 行政村代码
     * @param record_seq 某次调查
     * @return
     */
    @GET("com_getMosquito_invest.do")
    Observable<BaseResponse<List<MosquitoInvest>>> getMosquitoInvest(@Query("area_code") String area_code,
                                                                     @Query("record_seq") String record_seq);

    /**
     * 保存蚊媒数据
     * @param busy_type 行政村代码
     * @return
     */
    @POST("com_saveMosquito_invest.do")
    Observable<BaseResponse<Object>> saveMosquitoInvest(@Query("busy_type") String busy_type, @Body RequestBody requestBody);

    /**
     * 获取身份码
     * @param county_code 行政县代码
     * @return
     */
    @GET("com_getIdentity_id.do")
    Observable<BaseResponse<String>> getIdentityId(@Query("county_code") String county_code, @Query("birthday") String birthday,
                                                   @Query("pad_seq") String pad_seq, @Query("sex") String sex);

    /**************数据采集模块******************/

}
